import { rng } from './rng'
import { unsafeStringify } from './stringify'

export function v4(options?: any, buf?: Array<number>, offset?: number): string | Array<number> {
  if (crypto.randomUUID && !buf && !options) {
    return crypto.randomUUID()
  }

  options = options || {}

  const rnds = options.random || (options.rng || rng)()

  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
  rnds[6] = (rnds[6] & 0x0f) | 0x40
  rnds[8] = (rnds[8] & 0x3f) | 0x80

  // Copy bytes to buffer, if provided
  if (buf) {
    offset = offset || 0

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i]
    }

    return buf
  }

  return unsafeStringify(rnds)
}
